/*
 * @Author: Jae Frank[thissfk@qq.com]
 * @Date: 2024-02
 * @LastEditors: Jae Frank[thissfk@qq.com]
 * @LastEditTime: 2024-05
 * @FilePath: zf_device_gnss.h
 * @Description:
 *            If you need more information,
 * please contact Jae Frank[thissfk@qq.com] to get an access.
 * Copyright (c) 2024 by Jae Frank, All Rights Reserved.
 */
/*********************************************************************************************************************
 * CYT4BB Opensourec Library 即（ CYT4BB 开源库）是一个基于官方 SDK
 *接口的第三方开源库 Copyright (c) 2022 SEEKFREE 逐飞科技
 *
 * 本文件是 CYT4BB 开源库的一部分
 *
 * CYT4BB 开源库 是免费软件
 * 您可以根据自由软件基金会发布的 GPL（GNU General Public License，即
 *GNU通用公共许可证）的条款 即 GPL 的第3版（即
 *GPL3.0）或（您选择的）任何后来的版本，重新发布和/或修改它
 *
 * 本开源库的发布是希望它能发挥作用，但并未对其作任何的保证
 * 甚至没有隐含的适销性或适合特定用途的保证
 * 更多细节请参见 GPL
 *
 * 您应该在收到本开源库的同时收到一份 GPL 的副本
 * 如果没有，请参阅<https://www.gnu.org/licenses/>
 *
 * 额外注明：
 * 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
 * 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt
 *文件中 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
 * 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明（即本声明）
 *
 * 文件名称          zf_device_gnss
 * 公司名称          成都逐飞科技有限公司
 * 版本信息          查看 libraries/doc 文件夹内 version 文件 版本说明
 * 开发环境          IAR 9.40.1
 * 适用平台          CYT4BB
 * 店铺链接          https://seekfree.taobao.com/
 *
 * 修改记录
 * 日期              作者                备注
 * 2024-01-12       pudding           first version
 ********************************************************************************************************************/
/*********************************************************************************************************************
 * 接线定义：
 *                   ------------------------------------
 *                   模块管脚            单片机管脚
 *                   RX                  查看 zf_device_gnss.h 中 GNSS_RX 宏定义
 *                   TX                  查看 zf_device_gnss.h 中 GNSS_TX 宏定义
 *                   VCC                 3.3V电源
 *                   GND                 电源地
 *                   ------------------------------------
 ********************************************************************************************************************/

#ifndef _zf_device_gnss_h_
#define _zf_device_gnss_h_

#include "zf_common_typedef.h"

//--------------------------------------------------------------------------------------------------
// 引脚配置
//--------------------------------------------------------------------------------------------------
#define GNSS_UART (UART_2)
#define GNSS_RX (UART2_TX_P10_1) // GPS RX引脚连接到单片机此
#define GNSS_TX (UART2_RX_P10_0) // GPS TX串口引脚

#define ANGLE_TO_RAD(x) ((x)*GNSS_PI / 180.0) // 角度转换为弧度
#define RAD_TO_ANGLE(x) ((x)*180.0 / GNSS_PI) // 弧度转换为角度
#define GNSS_PI (3.1415926535898)

typedef enum {
  TAU1201 = 0, // 逐飞科技双频GPS模块
  GN42A = 1,   // 逐飞科技双频GPS模块 与TAU1201是一样的
  GN43RFA = 2, // 逐飞科技三频RTK模块
  LQBD1202     // 龙邱北斗1202模块
} gps_device_enum;

typedef struct {
  uint16 year;
  uint8 month;
  uint8 day;
  uint8 hour;
  uint8 minute;
  uint8 second;
} gps_time_struct;

typedef struct {
  gps_time_struct time; // 时间

  uint8 state; // 有效状态  1：定位有效  0：定位无效

  uint16 latitude_degree; // 度
  uint16 latitude_cent;   // 分
  uint16 latitude_second; // 秒 这里的秒是被放大了100倍的，主要是避免使用浮点数
  uint16 longitude_degree; // 度
  uint16 longitude_cent;   // 分
  uint16 longitude_second; // 秒 这里的秒是被放大了100倍的，主要是避免使用浮点数

  double latitude;  // 纬度
  double longitude; // 经度

  double pre_latitude;  // 上一次纬度
  double pre_longitude; // 上一次经度

  double pre_step_dis; // 最近一戳的距离

  int8 ns; // 纬度半球 N（北半球）或 S（南半球）
  int8 ew; // 经度半球 E（东经）或 W（西经）

  float speed; // 速度（m/s）
  float direction; // 地面航向（000.0~359.9 度，以真北方为参考基准）+
  float pre_direction; // 记录上一帧数据的方向信息
  uint8
      antenna_direction_state; // 双天线测向有效状态 1：测向有效
                               // 0：测向无效，无效时antenna_direction数据是无效的
  float antenna_direction; // 主天线指向从天线与真北构成的夹角（000.0~359.9 度）

  // 下面两个个信息从GNGGA语句中获取
  uint8 satellite_used; // 用于定位的卫星数量
  float height;         // 高度

  // 定位误差，由DOP和精度估计计算得到,+-()米
  float positionError;

} gnss_info_struct;

typedef struct {
  double x;    // 平面坐标x
  double y;    // 平面坐标y
  double zone; // UTM投影区代号
} UTM_t;

typedef enum {
  GPS_STATE_RECEIVING, // 正在接收数据
  GPS_STATE_RECEIVED,  // 数据接收完成
  GPS_STATE_PARSING,   // 正在解析
} gps_state_enum;

extern gnss_info_struct gnss;
extern uint8 gnss_flag;
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
double get_two_points_distance(double lat1, double lng1, double lat2,
                               double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2,
                              double lon2);
uint8 gnss_data_parse(void);
void gnss_uart_callback(void);
void gnss_init(gps_device_enum gps_device);
UTM_t gnss_LonLat2UTM(double lon, double lat);
#ifdef __cplusplus
}
#endif // __cplusplus

#endif
